package com.merry.mvc.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import com.merry.mvc.bean.Age;

/**
 * 在postman中测试获取参数的不同。
 */
@Controller
@RequestMapping("/param")
public class ParamController {

    /**
     * 通过原生servlet api获取参数
     * （了解）
     * 这种方法只能获取到使用 urlencoded传递的参数。
     * 比如get请求，或者post请求，但是post的形式是 x-www-form-urlencoded ：将form表单编码成urlencoded。
     */
    @RequestMapping("/getParam1")
    public String getParam1(HttpServletRequest servletRequest){
        String age = servletRequest.getParameter("age");
        System.out.println(age);
        return "target";
    }

    /**
     *   通过控制器方法的形参获取。与第一种方式类似。注入的原则是byName，也就是根据形参和request中的参数名进行注入。
     *   （了解）
     *   这种方法只能获取到使用 urlencoded传递的参数。
     *   比如get请求，或者post请求，但是post的形式是 x-www-form-urlencoded ：将form表单编码成urlencoded。
     */
    @RequestMapping("/getParam2")
    public String getParam2(String age){
        System.out.println(age);
        return "target";
    }

    /**
     * @param age
     * @return
     * 使用 @RequestParam注解获取参数。（重要）
     * 这种方法可以获取 urlencoded传递的参数。与上面类似。
     * 注入方式为：如果指定request中的参数名，则以这个参数名注入，如果注解中没有指定参数名，则根据形参名注入。
     */
    @RequestMapping("/getParam3")
    public String getParam3(@RequestParam("age") String age){
        System.out.println(age);
        return "target";
    }

    /**
     *
     * @param age
     * @return
     * 使用 @RequestHeader注解获取参数
     * 行为与 @RequestParam注解类似，唯一的区别在与这个注解是获取header中的值。
     */
    @RequestMapping("/getParam4")
    public String getParam4(@RequestHeader("age") String age){
        System.out.println(age);
        return "target";
    }

    /**
     * @param age
     * @return
     * 使用 @CookieValue 注解获取参数
     * 行为与 @RequestParam类似，唯一的区别是这个注解获取的是cookie中的值。
     */
    @RequestMapping("/getParam5")
    public String getParam5(@CookieValue("age") String age){
        System.out.println(age);
        return "target";
    }

    /**
     * @param age
     * @return
     * 使用 POJO+@RequestBody 获取参数
     */
    @RequestMapping("/getParam6")
    public String getParam6(@RequestBody Age age){
        System.out.println(age.getAge());
        return "target";
    }
}
